////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017-2018 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// THIS IS AUTO-GENERATED CODE.  PLEASE DO NOT EDIT (File bug reports against tools).
///
/// Auto-generated by: ParameterParser V1.1.4
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  aecextension.cpp
/// @brief Auto-generated Chromatix parameter file
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include "aecextension.h"
#include "parametersetmanager.h"

AECEXTENSION_NAMESPACE_BEGIN

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Default Constructor
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
AECCoreExtensionTypeClass::AECCoreExtensionTypeClass(
    const CHAR* name)
    : ParameterModule(name, MAJOR, MINOR, PATCH, 0, 0, 0, 0)
{
    PARAMETER_INITIALIZE(SymbolTableID);
    PARAMETER_INITIALIZE(module_version);
    PARAMETER_INITIALIZE(YHistStretch);
    PARAMETER_INITIALIZE(touchEVScnMonitor);
    PARAMETER_INITIALIZE(dualCam);
    PARAMETER_INITIALIZE(enableLVTest);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Constructor
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
AECCoreExtensionTypeClass::AECCoreExtensionTypeClass(
    const CHAR* name,
    UINT32 modeId,
    UINT16 mode,
    UINT16 subMode,
    UINT32 group)
    : ParameterModule(name, MAJOR, MINOR, PATCH, modeId, mode, subMode, group)
{
    PARAMETER_INITIALIZE(SymbolTableID);
    PARAMETER_INITIALIZE(module_version);
    PARAMETER_INITIALIZE(YHistStretch);
    PARAMETER_INITIALIZE(touchEVScnMonitor);
    PARAMETER_INITIALIZE(dualCam);
    PARAMETER_INITIALIZE(enableLVTest);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Destructor
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
AECCoreExtensionTypeClass::~AECCoreExtensionTypeClass()
{
    UnloadAECCoreExtensionType(this);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// GetName
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const CHAR* AECCoreExtensionTypeClass::GetName(
    const CHAR* type)
{
    const CHAR* name = type;
    CHAR temp[ParameterFileSymbolTableEntry::TYPE_LEN + 1];
    if (PARAMETER_STRCMP(type, ParameterFileSymbolTableEntry::GetType(temp, "Extension")) == 0)
    {
        name = "Extension";
    }
    return name;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load DualCamCCTExpCompType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreExtensionTypeClass::LoadDualCamCCTExpCompType(
    ParameterFileSymbolTableEntry* entry,
    DualCamCCTExpCompType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadInt32(&structure->CCT);
    result = result && entry->ReadFloat(&structure->compensationRatio);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load DualCamType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreExtensionTypeClass::LoadDualCamType(
    ParameterFileSymbolTableEntry* entry,
    DualCamType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadBoolean(&structure->enableDualCamExpComp);
    result = result && entry->ReadFloat(&structure->dualCamExpCompMultiplier);

    // Reading structure->CCTBasedExpComp from the symbol table
    {
        result = result && entry->ReadUInt32(&structure->CCTBasedExpCompCount);
        structure->CCTBasedExpCompID = entry->ID;
        ParameterFileSymbolTableEntry* pointerEntry1 = entry->Table->ReadPointerEntry(entry);
        result = result && pointerEntry1 != NULL;
        if (result)
        {
            structure->CCTBasedExpComp   = PARAMETER_NEW DualCamCCTExpCompType[structure->CCTBasedExpCompCount];
        }
        if (!result || structure->CCTBasedExpComp == NULL)
        {
            structure->CCTBasedExpCompCount = 0;
        }
        for (UINT32 i = 0; result && i < structure->CCTBasedExpCompCount; i++)
        {
            result = result && LoadDualCamCCTExpCompType(pointerEntry1, &structure->CCTBasedExpComp[i]);
        }
    }

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load TouchEVSceneChangeType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreExtensionTypeClass::LoadTouchEVSceneChangeType(
    ParameterFileSymbolTableEntry* entry,
    TouchEVSceneChangeType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadBoolean(&structure->enableTouchEVScnDet);
    result = result && entry->ReadInt32(&structure->thresLumaDelta);
    result = result && entry->ReadFloat(&structure->thresLumaAvgPct);
    result = result && entry->ReadFloat(&structure->minLumaAvg);
    result = result && entry->ReadInt32(&structure->frameDelayBeforeStable);
    result = result && entry->ReadInt32(&structure->temporalLumaAverageCount);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load YHistStretchZoneDataType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreExtensionTypeClass::LoadYHistStretchZoneDataType(
    ParameterFileSymbolTableEntry* entry,
    YHistStretchZoneDataType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadFloat(&structure->darkBinThres);
    result = result && entry->ReadFloat(&structure->darkBinThresLow);
    result = result && entry->ReadFloat(&structure->satBinThres);
    result = result && entry->ReadFloat(&structure->satBinThresLow);
    result = result && entry->ReadInt32(&structure->darkTargetLvL);
    result = result && entry->ReadInt32(&structure->satTargetLvL);
    result = result && entry->ReadFloat(&structure->satScalingMax);
    result = result && entry->ReadInt32(&structure->darkClampingMax);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load YHistStretchZoneType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreExtensionTypeClass::LoadYHistStretchZoneType(
    ParameterFileSymbolTableEntry* entry,
    YHistStretchZoneType* structure)
{
    BOOL result = TRUE;
    result = result && aecglobalelements::aecglobalelementsClass::LoadTriggerPointType(entry, &structure->zoneTrigger);
    result = result && LoadYHistStretchZoneDataType(entry, &structure->zoneData);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load YHistStretchType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreExtensionTypeClass::LoadYHistStretchType(
    ParameterFileSymbolTableEntry* entry,
    YHistStretchType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadBoolean(&structure->enableYHistStretch);
    result = result && entry->ReadFloat(&structure->tempFilter);

    // Reading structure->yHistStretchZone from the symbol table
    {
        result = result && entry->ReadUInt32(&structure->yHistStretchZoneCount);
        structure->yHistStretchZoneID = entry->ID;
        ParameterFileSymbolTableEntry* pointerEntry1 = entry->Table->ReadPointerEntry(entry);
        result = result && pointerEntry1 != NULL;
        if (result)
        {
            structure->yHistStretchZone   = PARAMETER_NEW YHistStretchZoneType[structure->yHistStretchZoneCount];
        }
        if (!result || structure->yHistStretchZone == NULL)
        {
            structure->yHistStretchZoneCount = 0;
        }
        for (UINT32 i = 0; result && i < structure->yHistStretchZoneCount; i++)
        {
            result = result && LoadYHistStretchZoneType(pointerEntry1, &structure->yHistStretchZone[i]);
        }
    }

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load AECCoreExtensionType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreExtensionTypeClass::LoadAECCoreExtensionType(
    ParameterFileSymbolTableEntry* entry,
    AECCoreExtensionType* structure)
{
    BOOL result = TRUE;
    result = result && Loadmodule_versionStruct(entry, &structure->module_version);
    result = result && LoadYHistStretchType(entry, &structure->YHistStretch);
    result = result && LoadTouchEVSceneChangeType(entry, &structure->touchEVScnMonitor);
    result = result && LoadDualCamType(entry, &structure->dualCam);
    result = result && entry->ReadBoolean(&structure->enableLVTest);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load module_versionStruct
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreExtensionTypeClass::Loadmodule_versionStruct(
    ParameterFileSymbolTableEntry* entry,
    AECCoreExtensionType::module_versionStruct* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadInt32(&structure->major_revision);
    result = result && entry->ReadInt32(&structure->minor_revision);
    result = result && entry->ReadInt32(&structure->incr_revision);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload DualCamType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void AECCoreExtensionTypeClass::UnloadDualCamType(
    DualCamType* structure)
{
    PARAMETER_DELETE[] structure->CCTBasedExpComp;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload YHistStretchType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void AECCoreExtensionTypeClass::UnloadYHistStretchType(
    YHistStretchType* structure)
{
    PARAMETER_DELETE[] structure->yHistStretchZone;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload AECCoreExtensionType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void AECCoreExtensionTypeClass::UnloadAECCoreExtensionType(
    AECCoreExtensionType* structure)
{
    UnloadYHistStretchType(&structure->YHistStretch);
    UnloadDualCamType(&structure->dualCam);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Parse symbol table entry, and return a new object
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ParameterModule* AECCoreExtensionTypeClass::Parse(
    ParameterSetManager* manager,
    ParameterFileSymbolTableEntry* entry) const
{
    AECCoreExtensionTypeClass* cls = NULL;

    if (PARAMETER_STRCMP(Type, entry->Type) == 0 && Major == entry->Major &&
        Minor == entry->Minor && Patch == entry->Patch)
    {
        cls = PARAMETER_NEW AECCoreExtensionTypeClass(GetName(entry->Type), 
            entry->ModeId, entry->Mode, entry->SubMode, entry->Group);
        if (cls != NULL)
        {
            BOOL result = TRUE;

            cls->SymbolTableID = entry->ID;
            cls->ID            = entry->ID;

            result = result && LoadAECCoreExtensionType(entry, cls);

            if (!result)
            {
                PARAMETER_DELETE cls;
                cls = NULL;
            }
        }
    }
    return (ParameterModule*)cls;
}


AECEXTENSION_NAMESPACE_END
